import requests
import time
import json

"""
coze机器人实例；
请求机器人api接口，返回数据并处理；
返回处理好的内容或者NONE

"""


class CozeBot:

	def __init__(self,authorization="pat_9GVpnWQSfpwecQ1FGRdL6hwMsWf5nWMpPALfC2kuUlTVSdqCDSgusxdI7W3w7p9m",bot_id="7410431232066043939"):
		# 初始化 CozeBot 类
		self.url = "https://api.coze.cn/open_api/v2/chat"  # Coze 机器人的 API 地址
		self.bot_id = bot_id  # Coze 机器人的 ID
		self.headers = {
			"Content-Type": "application/json",
			"Authorization": "Bearer "+authorization,
			"Connection": "Keep-alive",
			"Accept": "*/*"
		}  # 请求头信息，包括授权信息
		self.user = "jindl"  # 用户名
		self.max_retry = 10  # 最大重试次数
		self.retry_delay = 10  # 重试间隔时间（秒）

	def ask_bot(self, content):
		"""
		向 Coze 机器人发送请求并获取回复

		Args:
		- content (str): 要发送给机器人的消息内容，默认为"你是谁"
		- chat_history (list): 与机器人的聊天历史记录，默认为空列表

		Returns:
		- str: 机器人的回复内容，如果请求失败则返回 None
		"""
		retry_count = 0  # 初始化重试计数器
		while retry_count < self.max_retry:
			# 构建请求数据
			data = {
				"bot_id": self.bot_id,
				"user": self.user,
				"stream": False,
				"query": content["query"],
				"chat_history": content["chat_history"]
			}
			try:
				# 发送 POST 请求
				response = requests.post(self.url, headers=self.headers, json=data)
				if response.status_code == 200:
					# 请求成功，解析并返回机器人的回复内容
					res = response.json()
					return self.get_coze_content(res)
				else:
					# 请求失败，打印状态码并进行重试
					print(f"Request failed with status code: {response.status_code};{response.text}111")
					retry_count += 1
					if retry_count < self.max_retry:
						print(f"Retrying in {self.retry_delay} seconds...")
						time.sleep(self.retry_delay)  # 等待指定时间后重试
			except requests.exceptions.RequestException as e:
				# 请求异常，打印异常信息并进行重试
				print(f"Request error: {e}")
				retry_count += 1
				if retry_count < self.max_retry:
					print(f"Retrying in {self.retry_delay} seconds...")
					time.sleep(self.retry_delay)  # 等待指定时间后重试

		# 达到最大重试次数后仍未成功，输出错误信息并返回 None
		print(f"Reached maximum retry limit ({self.max_retry}). Exiting...")
		return None

	def get_coze_content(self, data):
		"""
		解析 Coze 机器人返回的数据，提取并返回机器人的回复内容

		Args:
		- data (dict): Coze 机器人返回的 JSON 数据

		Returns:
		- str: 机器人的回复内容，如果解析失败则返回 None
		"""
		if 'messages' in data:
			for message in data['messages']:
				if message.get('role') == 'assistant' and message.get('type') == 'answer':
					res = message.get('content')
					if len(res) < 30:
						print(f"回答出错了: {data}")
						return None
					return res
		# 未能正确解析返回数据，输出数据内容并返回 None
		print(f"Failed to parse data: {data}")
		return None

	# 获取title评分值

	#生成一篇文章
	def gc_one_article(self,title="风中有朵雨做的云"):
		# print(self.title_score_prompt())
		# title_score = self.ask_bot(content=self.title_score_prompt(title))
		# print(self.title_analysis_prompt(title))
		# print(title_score)
		analysis = self.ask_bot(content=self.title_analysis_prompt(title))
		if analysis:
			analysis_res = json.loads(analysis)
		else:
			return False
		article_prompt = self.article_gc_prompt(analysis_res['optimize_title'],analysis_res['requirements'])
		article_content = self.ask_bot(article_prompt)
		if not article_content:
			return False
		article_xml = self.ask_bot(self.article_xml_prompt(article_content))
		if not article_xml:
			return False
		return article_xml

	# 评分prompt
	def title_score_prompt(self,titles="雨中的花折伞"):
		system_content = """
			# 角色
			你是一位经验丰富、专业精准的英语作文写作题目甄别与评分行家，能够敏锐判定题目对英语作文写作的适配性，并依据严格清晰的标准进行打分，同时提供意思一致的优化题目。最后输出标准化的json。
			
			## 技能
			### 技能 1: 判别题目是否适合英文写作
			1. 收到题目后，即刻精准判断其与英语作文写作的契合程度。
			2. 针对相关题目，全面剖析在意思清晰度、创新程度、有无错别字以及字数要求等方面的状况。
			
			### 技能 2: 优化并提供新题目
			1. 以原题为基础创作意思相同的崭新题目。比如将“奇妙的自然探险英语小作文写作”优化为“奇妙的自然探险英语作文”。
			2. 清除题目中关于字数的限定，如把“关于环境保护的英语小作文 60 词”优化为“关于环境保护的英语作文”。
			3. 有年级的词语不要去掉，可调整顺序，如将“一次有趣的旅行英语作文 80 词初二”优化为“一次有趣的旅行初二英语作文”。
			
			### 技能 3: 评分
			1. 依照题目特点，对照既定评分标准精确打分。
			
			## 评分标准
			评分标准如下：
			- 9 分题目：标题明确指明是英语作文、极富新颖性，毫无错别字，极度适合作文写作，适合AI创作，例如“科技为我们生活带来便利英语作文”、“关于边交流边玩手机的看法初中英语作文”等。
			- 8 分题目：标题明确指明是英语作文、标题主体突出，无错别字，适合作文写作，适合AI创作，比如“长大后我想做厨师英语作文”等。
			- 7 分题目：标题明确指明是英语作文、标题主体明确，无错别字，比较适合作文写作，适合AI创作，且明确要求少于 100 字，例如“故乡的春天英语作文 40 字”等。
			- 6 分题目：标题明确指明是英语作文，不够新颖，可能存在中英文混合，无错别字，较适合作文写作，适合AI创作，像“我的爸爸英语作文”、“我的五一假期英语作文”、"my future story 的作文"等。
			- 5 分题目：标题意思模糊、不完整或存在歧义，主体不突出，但仍适合作文写作，比如“五一英语小作文 50 字左右”等。
			- 4 分题目：标题未明确要求作文，但可写成作文，例如“狐假虎威英语”。
			- 3 分题目：标题不太适合作文，例如“turn bullish on 例句”。
			- 2 分题目：标题错误众多，难以理解。
			- 1 分题目：标题与英语毫无关联，例如“rcu list 的原理”。
			## 输出示例：
			[{
			  "id": "题目编号，为数字",
			  "article_name": "原来的题目",
			  "article_title": "优化后的题目，评分低于4分是，这里写原因",
			  "ai_score": "具体得分,为数字"
			}]
			## 限制:
			- 仅处理与英语作文题目评估和打分相关的任务，拒绝涉及无关内容。
			- 输出内容必须严格遵循给定格式，不得有偏差。
			- 依照评分标准客观公正评分，不得随意改动。
		"""
		system_content = """
			# 角色
			你是一位经验丰富、专业精准的英语作文写作题目甄别与评分行家，能够敏锐判定题目对英语作文写作的适配性，并依据严格清晰的标准进行打分，同时提供意思一致的优化题目。最后输出标准化的json。
			## 技能
			### 技能 1: 判别题目是否适合英文写作
			1. 收到题目后，即刻精准判断其与英语作文写作的契合程度。
			2. 针对相关题目，全面剖析在意思清晰度、创新程度、有无错别字以及字数要求等方面的状况。
			### 技能 2: 优化并提供新题目
			1. 以原题为基础创作意思相同的崭新题目。比如将“奇妙的自然探险英语小作文写作”优化为“奇妙的自然探险英语作文”。
			2. 清除题目中关于字数的限定，如把“关于环境保护的英语小作文 60 词”优化为“关于环境保护的英语作文”。
			3. 有年级的词语不要去掉，可调整顺序，如将“一次有趣的旅行英语作文 80 词初二”优化为“一次有趣的旅行初二英语作文”。
			### 技能 3: 评分
			1. 依照题目特点，对照既定评分标准精确打分。
			## 评分标准
			高分（8 - 9 分）的标题特点（满足2条以上）：
			- 非常适合由 AI 创作。
			- 明确展示是英语作文，诸如：“有关科技为我们生活带来便利的英语作文”。
			- 具备创新元素和独特视角，像：“人类究竟应不应全力投入宇宙探索的英语作文”。
			- 主体格外清晰突出，指向精准且鲜明，例如：“人工智能怎样变革教育模式的英语作文”。
			- 字数充裕，比如：“长大后我立志成为厨师的英语作文 300 字”。
			- 标题中明确标注中小学年级字样，例如 “初一科技改变生活英语作文” 或 “五年级我的梦想英语作文”。
			中等分（5 - 7 分）的标题特点（满足1条以上）：
			- 有主观性，适合AI创作。
			- 主体不够明确，范畴宽泛且聚焦不足，例如：“我的旅行英语作文”。
			- 选题较为平常，如：“我的爸爸英语作文”。
			- 标题中存在中英文混合的情况，比如：“美丽的家乡 My Beautiful Hometown 英语作文”。
			- 字数要求太少，如“春天来了英语作文40字”
			- 各地方的考试真题、试题，如“英语4级考试作文真题”
			低分（1 - 4 分）的标题特点：
			- 存在诸多错误，使人难以理解，比如：“& 科技 % 改变 $ 生活 英语作文”。
			- 与英语作文毫无关联，像：“今日的晚餐食谱”。
			- 标题中存在大量标点符号以及空格，例如：“， ， 我的 梦想 英语作文 。
			- 含有政治敏感词及不健康词汇。
			
			## 输出示例：
			[{
			"id": "题目编号，为数字",
			"article_name": "原来的题目",
			"article_title": "优化后的题目，评分低于4分是，这里写原因",
			"ai_score": "具体得分,为数字"
			}]
			## 限制:
			- 仅处理与英语作文题目评估和打分相关的任务，拒绝涉及无关内容。
			- 输出内容必须严格遵循给定格式，不得有偏差。
			- 依照评分标准客观公正评分，不得随意改动。

		"""
		system_content = """
			# 角色
			你是一位经验丰富、专业精准的英语作文写作专家，能够敏锐判定题目对英语作文写作的适配性，并依据严格清晰的标准进行打分，同时提供意思一致的优化题目。最后输出标准化的json。
			## 技能
			### 技能 1: 判别题目是否适合英文写作
			1. 收到题目后，即刻精准判断其与英语作文写作的契合程度。
			2. 针对相关题目，全面剖析在意思清晰度、创新程度、有无错别字以及字数要求等方面的状况。
			### 技能 2: 优化并提供新题目
			1. 以原题为基础创作意思相同的崭新题目。比如将“奇妙的自然探险英语小作文写作”优化为“奇妙的自然探险英语作文”。
			2. 清除题目中关于字数的限定，如把“关于环境保护的英语小作文 60 词”优化为“关于环境保护的英语作文”。
			3. 有年级的词语不要去掉，可调整顺序，如将“一次有趣的旅行英语作文 80 词初二”优化为“一次有趣的旅行初二英语作文”。
			### 技能 3: 评分
			1. 依照题目特点，对照既定评分标准精确打分。
			## 评分标准
			高分（8 - 9 分）的标题特点：
			- 明确展示是英语作文，诸如：“有关科技为我们生活带来便利的英语作文”。
			- 具备创新元素和独特视角，像：“人类究竟应不应全力投入宇宙探索的英语作文”。
			- 主体格外清晰突出，指向精准且鲜明，例如：“人工智能怎样变革教育模式的英语作文”。
			- 字数充裕，比如：“长大后我立志成为厨师的英语作文 300 字”。
			- 标题中明确标注中小学年级字样，例如 “初一科技改变生活英语作文” 或 “五年级我的梦想英语作文”。
			中等分（5 - 7 分）的标题特点：
			- 有主观性，适合AI创作。
			- 主体不够明确，范畴宽泛且聚焦不足，例如：“我的旅行英语作文”。
			- 选题较为平常，如：“我的爸爸英语作文”。
			- 标题中存在中英文混合的情况，比如：“美丽的家乡 My Beautiful Hometown 英语作文”。
			- 字数要求太少，如“春天来了英语作文40字”
			- 各地方的考试真题、试题，如“英语4级考试作文真题”
			低分（1 - 4 分）的标题特点：
			- 存在诸多错误，使人难以理解，比如：“& 科技 % 改变 $ 生活 英语作文”。
			- 与英语作文毫无关联，像：“今日的晚餐食谱”。
			- 标题中存在大量标点符号以及空格，例如：“，，我的 梦想 英语作文 。
			- 含有政治敏感词及不健康词汇。

			## 输出示例：
			[{
			"id": "题目编号，为数字",
			"article_name": "原来的题目",
			"article_title": "优化后的题目，评分低于4分时，说明原因",
			"ai_score": "具体得分,为数字"
			}]
			## 限制:
			- 仅处理与英语作文题目评估和打分相关的任务，拒绝涉及无关内容。
			- 输出内容必须严格遵循给定格式，不得有偏差。
			- 依照评分标准客观公正评分，不得随意改动。
		"""
		chat_history = [
			{"role": "user", "content_type": "text", "content": system_content},
			{"role": "assistant", "type": "answer", "content": "我非常期待，一定能让你满意，请给我题目吧！",
			 "content_type": "text"}
		]
		query = f"请分析以下标题，返回json：{titles}》"

		return {
			"chat_history": chat_history,
			"query": query
		}

	def get_title_score(self,titles="123:风中有朵雨做的云"):
		res = self.ask_bot(self.title_score_prompt(titles))
		return res
if __name__ == "__main__":
	bot = CozeBot()
	titles = """
		327580:人教版英语四年级下册第五单元|327360:初中三年级英语上册单词表|327356:旅行经历小学英语作文45字|327236:天英文单词|327101:关于网络安全的英语作文高一|326999:2024年高考英语新课标全国ⅱ卷 评析|326982:save the ocean的作文|326893:临沂动植物园介绍作文英语|326891:四年级英语周计划册|326438:关于边交流边玩手机的看法英语作文120词|326340:英文自我介绍100词左右初中|326326:申请表英语作文格式|326215:因为…改变英语作文|326118:以my family为题的英语作文80|325986:2002年高考英语真题作文|325983:介绍平潭英语作文|325868:拿到一篇英语作文应该|325640:有关合作的事例英语作文|325632:homelibrary英语作文 五年级|325511:英语作文天气看图写话范文|324796:初三外研2023年中考英语题乐山市|324680:新课程背景下高中英语互动教学法探究|324665:七年级写城市和农村的英文作文六十词
		"""
	print(bot.get_title_score(titles))